package cn.com.nou.common.utils;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.springframework.web.multipart.MultipartFile;



/**
 * 
 * @ClassName: FileUtils 
 * @Description: 文件处理工具类 
 * @author yuanyang
 * @date 2018年12月19日
 */
public class FileUtils {

	/**
	 * @Fields IMAGE_FILE_EXTENSION : 上传图片时允许的文件类型
	 */
	public static final String IMAGE_FILE_EXTENSION = ".jpg|.jpeg|.png|.gif|";

	/**
	 * @Fields EXCEL_FILE_EXTENSION : 上传Excel时允许的文件类型
	 */
	public static final String EXCEL_FILE_EXTENSION = ".xls|.xlsx|.csv|";

	/**
	 * @Fields MSEXCEL_FILE_EXTENSION : 上传MSEXCEL时允许的文件类型
	 */
	public static final String MSEXCEL_FILE_EXTENSION = ".xls|.xlsx|";

	/**
	 * @Fields MSWORD_FILE_EXTENSION : 上传MSWORD时允许的文件类型
	 */
	public static final String MSWORD_FILE_EXTENSION = ".doc|.docx|";

	/**
	 * @Fields MSPOWERPOINT_FILE_EXTENSION : 上传MSPOWERPOINT时允许的文件类型
	 */
	public static final String MSPOWERPOINT_FILE_EXTENSION = ".ppt|.pptx|";

	/**
	 * @Fields HTML_FILE_EXTENSION : 上传html时允许的文件类型
	 */
	public static final String HTML_FILE_EXTENSION = ".html|.htm|";

	/**
	 * @Fields TXT_FILE_EXTENSION : 上传txt时允许的文件类型
	 */
	public static final String TXT_FILE_EXTENSION = ".txt|";

	/**
	 * @Fields XML_FILE_EXTENSION : 上传xml时允许的文件类型
	 */
	public static final String XML_FILE_EXTENSION = ".xml|";

	/**
	 * @Fields PDF_FILE_EXTENSION : 上传pdf时允许的文件类型
	 */
	public static final String PDF_FILE_EXTENSION = ".pdf|";

	/**
	 * @Fields ATTACHMENT_EXTENSION : 可执行文件
	 */
	public static final String ATTACHMENT_EXTENSION = ".doc|.docx|.xls|.xlsx|.ppt|.pptx|.pdf|.zip|.rar|.txt|";

	/**
	 * @Fields OFFICE_EXTENSION : office文件
	 */
	public static final String OFFICE_EXTENSION = ".doc|.docx|.xls|.xlsx|.ppt|.pptx|.pdf|";

	/**
	 * @Fields PROJECT_RESOURCE_EXTENSION : 项目资源类型
	 */
	public static final String PROJECT_RESOURCE_EXTENSION = ".zip|";
	/**
	 * @Fields PROJECT_DB_EXTENSION : 项目数据库类型
	 */
	public static final String PROJECT_DB_EXTENSION = ".sql|";

	/**
	 * @Fields FILE_SIZE_M : 上传文件大小最大为100M
	 */
	public static final long FILE_SIZE_M = 100;
	public static final long VIDEO_SIZE_M = 500;
	public static final long PIC_SIZE_M = 2;
	
	public static final String DBF_FILE_EXTENSION = ".dbf|";

	
	public static final int IMAGE_WIDTH = 640;
	public static final int IMAGE_HEIGHT = 360;
	/**
	 * @Title: isImageFile
	 * @Description: 是否为图片
	 * @param imgFile
	 * @return boolean
	 */
	public static boolean isImageFile(MultipartFile imgFile) {
		// 提取上传文件的类型
		String fileName = imgFile.getOriginalFilename();
		// 获取上传文件类型的扩展名,先得到.的位置，再截取从.的下一个位置到文件的最后，最后得到扩展名 ，对扩展名进行小写转换
		String extName = fileName
				.substring(
						fileName.lastIndexOf(".") == -1 ? 0 : fileName
								.lastIndexOf(".")).toLowerCase();
		// 判断上传文件类型是否允许上传
		if (IMAGE_FILE_EXTENSION.toLowerCase().indexOf(extName.concat("|")) == -1) {
			return false;
		} else {
			return true;
		}
	}

	/**
	 * @Title: isExcelFile
	 * @Description: 是否为Excel文件
	 * @param imgFile
	 * @return boolean
	 */
	public static boolean isExcelFile(MultipartFile imgFile) {
		// 提取上传文件的类型
		String fileName = imgFile.getOriginalFilename();
		// 获取上传文件类型的扩展名,先得到.的位置，再截取从.的下一个位置到文件的最后，最后得到扩展名 ，对扩展名进行小写转换
		String extName = fileName
				.substring(
						fileName.lastIndexOf(".") == -1 ? 0 : fileName
								.lastIndexOf(".")).toLowerCase();
		// 判断上传文件类型是否允许上传
		if (EXCEL_FILE_EXTENSION.toLowerCase().indexOf(extName.concat("|")) == -1) {
			return false;
		} else {
			return true;
		}
	}

	/**
	 * @Title: isExcelFile
	 * @Description: 是否为PDF文件
	 * @param imgFile
	 * @return boolean
	 */
	public static boolean isPDFFile(MultipartFile imgFile) {
		// 提取上传文件的类型
		String fileName = imgFile.getOriginalFilename();
		// 获取上传文件类型的扩展名,先得到.的位置，再截取从.的下一个位置到文件的最后，最后得到扩展名 ，对扩展名进行小写转换
		String extName = fileName
				.substring(
						fileName.lastIndexOf(".") == -1 ? 0 : fileName
								.lastIndexOf(".")).toLowerCase();
		// 判断上传文件类型是否允许上传
		if (PDF_FILE_EXTENSION.toLowerCase().indexOf(extName.concat("|")) == -1) {
			return false;
		} else {
			return true;
		}
	}

	/**
	 * @Title: isProjectResourceFile
	 * @Description: 是否为项目资源文件
	 * @param imgFile
	 * @return boolean
	 */
	public static boolean isProjectResourceFile(MultipartFile imgFile) {
		// 提取上传文件的类型
		String fileName = imgFile.getOriginalFilename();
		// 获取上传文件类型的扩展名,先得到.的位置，再截取从.的下一个位置到文件的最后，最后得到扩展名 ，对扩展名进行小写转换
		String extName = fileName
				.substring(
						fileName.lastIndexOf(".") == -1 ? 0 : fileName
								.lastIndexOf(".")).toLowerCase();
		// 判断上传文件类型是否允许上传
		if (PROJECT_RESOURCE_EXTENSION.toLowerCase().indexOf(
				extName.concat("|")) == -1) {
			return false;
		} else {
			return true;
		}
	}

	/**
	 * @Title: isProjectDBFile
	 * @Description: 是否为项目数据库文件
	 * @param imgFile
	 * @return boolean
	 */
	public static boolean isProjectDBFile(MultipartFile imgFile) {
		// 提取上传文件的类型
		String fileName = imgFile.getOriginalFilename();
		// 获取上传文件类型的扩展名,先得到.的位置，再截取从.的下一个位置到文件的最后，最后得到扩展名 ，对扩展名进行小写转换
		String extName = fileName
				.substring(
						fileName.lastIndexOf(".") == -1 ? 0 : fileName
								.lastIndexOf(".")).toLowerCase();
		// 判断上传文件类型是否允许上传
		if (PROJECT_DB_EXTENSION.toLowerCase().indexOf(extName.concat("|")) == -1) {
			return false;
		} else {
			return true;
		}
	}

	/**
	 * @Title: isAttachment
	 * @Description: 是否为可执行文件
	 * @param imgFile
	 * @return boolean
	 */
	public static boolean isAttachment(MultipartFile imgFile) {
		if (imgFile != null) {
			// 提取上传文件的类型
			String fileName = imgFile.getOriginalFilename();
			// 获取上传文件类型的扩展名,先得到.的位置，再截取从.的下一个位置到文件的最后，最后得到扩展名 ，对扩展名进行小写转换
			String extName = fileName.substring(
					fileName.lastIndexOf(".") == -1 ? 0 : fileName
							.lastIndexOf(".")).toLowerCase();
			// 判断上传文件类型是否允许上传
			if (ATTACHMENT_EXTENSION.toLowerCase().indexOf(extName.concat("|")) == -1) {
				return false;
			} else {
				return true;
			}
		} else {
			return false;
		}
	}

	
	public static boolean isAttachment(MultipartFile imgFile,String attachmentExtension) {
		if (imgFile != null) {
			// 提取上传文件的类型
			String fileName = imgFile.getOriginalFilename();
			// 获取上传文件类型的扩展名,先得到.的位置，再截取从.的下一个位置到文件的最后，最后得到扩展名 ，对扩展名进行小写转换
			String extName = fileName.substring(
					fileName.lastIndexOf(".") == -1 ? 0 : fileName
							.lastIndexOf(".")).toLowerCase();
			// 判断上传文件类型是否允许上传
			if (attachmentExtension.toLowerCase().indexOf(extName.concat("|")) == -1) {
				return false;
			} else {
				return true;
			}
		} else {
			return false;
		}
	}
	
	/**
	 * @Title: isAttachment
	 * @Description: 是否为可执行文件
	 * @param imgFile
	 * @return boolean
	 */
	public static boolean isOfficeFile(MultipartFile file) {
		if (file != null) {
			// 提取上传文件的类型
			String fileName = file.getOriginalFilename();
			// 获取上传文件类型的扩展名,先得到.的位置，再截取从.的下一个位置到文件的最后，最后得到扩展名 ，对扩展名进行小写转换
			String extName = fileName.substring(
					fileName.lastIndexOf(".") == -1 ? 0 : fileName
							.lastIndexOf(".")).toLowerCase();
			// 判断上传文件类型是否允许上传
			if (OFFICE_EXTENSION.toLowerCase().indexOf(extName.concat("|")) == -1) {
				return false;
			} else {
				return true;
			}
		} else {
			return false;
		}
	}

	/**
	 * @Title: isFileSize
	 * @Description: 判断上传文件大小是否允许上传
	 * @param file
	 * @return boolean
	 */
	public static boolean isFileSize(MultipartFile file,String type) {
		boolean res = false;
		if (file != null) {
			long fileSize = file.getSize();
			// 判断上传文件大小是否允许上传
			if (type.equals(Constant.PIC_TYPE)) {//图片
				if (fileSize <= PIC_SIZE_M * 1024 * 1024) {
					return true;
				} 
			}else if (type.equals(Constant.FILE_TYPE)) {//文件
				if (fileSize <= FILE_SIZE_M * 1024 * 1024) {
					return true;
				} 
			}else if (type.equals(Constant.VIDEO_TYPE)) {//视频
				if (fileSize <= VIDEO_SIZE_M * 1024 * 1024) {
					return true;
				} 
			}
		} 
		return res;
	}
	
	
	/**
	 * 
	 * @Title: isDBFFile 
	 * @Description: TODO 
	 * @param imgFile
	 * @return
	 */
	public static boolean isDBFFile(MultipartFile imgFile) {
		// 提取上传文件的类型
		String fileName = imgFile.getOriginalFilename();
		// 获取上传文件类型的扩展名,先得到.的位置，再截取从.的下一个位置到文件的最后，最后得到扩展名 ，对扩展名进行小写转换
		String extName = fileName
				.substring(
						fileName.lastIndexOf(".") == -1 ? 0 : fileName
								.lastIndexOf(".")).toLowerCase();
		// 判断上传文件类型是否允许上传
		if (DBF_FILE_EXTENSION.toLowerCase().indexOf(extName.concat("|")) == -1) {
			return false;
		} else {
			return true;
		}
	}
	
	
	
	/**
	 * 
	 * @Title: checkImageElement 
	 * @Description: 图片像素判断 
	 * @author yuanyang
	 * @date 2019年2月26日
	 */
	public static boolean checkImageElement(MultipartFile imgFile,int height,int width) throws IOException {
		Boolean result = false;
		if (imgFile == null) {
			return false;
		}
		BufferedImage bufferedImage = ImageIO.read(imgFile.getInputStream());
		int w = bufferedImage.getWidth();
		int h = bufferedImage.getHeight();
		if (bufferedImage != null && h == height && w == width) {
			result = true;
		}
		return result;
	}
	

	/**
	 * 
	 * @Title: checkImageScale 
	 * @Description: 图片比例判断 
	 * @author yuanyang
	 * @date 2019年2月26日
	 */
	public static boolean checkImageScale(MultipartFile imgFile) throws IOException {
		Boolean result = false;
		if (imgFile == null) {
			return false;
		}
		BufferedImage bufferedImage = ImageIO.read(imgFile.getInputStream());
		int width = bufferedImage.getWidth();
		int height = bufferedImage.getHeight();
		if (IMAGE_HEIGHT != 0 && height != 0) {
			int scale1 = IMAGE_HEIGHT / IMAGE_WIDTH;
			int scale2 = height / width;
			if (scale1 == scale2) {
				result = true;
			}
		}
		return result;
	}

}
